home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
HPAVC
/
HPAVC CD-ROM.iso
/
ABUSESRC.ZIP
/
AbuseSrc
/
abuse
/
src
/
install.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-04-11
|
7KB
|
298 lines
#define NO_LIBS 1
#include "lisp.c"
#include "trig.c"
#include "lisp_gc.c"
#include "lisp_opt.c"
#include "text_gui.c"
enum { LINUX, WATCOM, AIX, SUN, SGI };
char *plat_names[] = {"Linux (SVGA & X11)",
"Watcom for MS-DOS",
"IBM AIX for RS6000's",
"Sun OS",
"Silicon Graphics"};
char *plat_name[] = {"LINUX","WATCOM","AIX","SUN","SGI"};
int detect_platform()
{
#ifdef __linux__
return LINUX;
#endif
#ifdef __WATCOMC__
return WATCOM;
#endif
#ifdef _AIX
return AIX;
#endif
#ifdef sun
return SUN;
#endif
#ifdef SUN3
return SUN;
#endif
#ifdef SUN4
return SUN;
#endif
#ifdef __sgi
return SGI;
#endif
printf("Cannot detect platform\n");
exit(1);
return 0;
}
long c_caller(long number, void *arg) // exten c function switches on number
{
switch (number)
{
case 0 :
{
char cd[100];
getcwd(cd,100);
int t=change_dir(lstring_value(CAR(arg)));
change_dir(cd);
return t;
} break;
case 1 :
{
if (change_dir(lstring_value(eval(CAR(arg)))))
return 1;
else return 0;
} break;
case 2 :
{
return K_avail(lstring_value(CAR(arg)));
} break;
case 3 :
{
void *title=eval(CAR(arg)); arg=CDR(arg); p_ref r1(title);
void *source=eval(CAR(arg)); arg=CDR(arg); p_ref r2(source);
void *dest=eval(CAR(arg)); arg=CDR(arg); p_ref r3(dest);
return nice_copy(lstring_value(title),lstring_value(source),lstring_value(dest));
} break;
case 4 :
{
if (access(lstring_value(eval(CAR(arg))),R_OK)==0)
return 1;
else
return 0;
} break;
}
return 0;
}
int nice_copy(char *title, char *source, char *dest);
void *l_obj_get(long number) { return NULL; } // exten lisp function switches on number
void l_obj_set(long number, void *arg) { ; } // exten lisp function switches on number
void l_obj_print(long number) { ; } // exten lisp function switches on number
void clisp_init()
{ // external initalizer call by lisp_init()
void *platform=make_find_symbol("platform");
set_symbol_value(platform,make_find_symbol(plat_name[detect_platform()]));
add_lisp_function("system",1,1, 0);
add_lisp_function("split_filename",2,2, 1);
add_lisp_function("convert_slashes",2,2, 2);
add_lisp_function("make_dir",1,1, 3);
add_lisp_function("extension",1,1, 4);
add_lisp_function("nice_input",3,3, 5); // title, prompt, default -> returns input
add_lisp_function("nice_menu",3,3, 6); // title, menu_title, list -> return selection number
add_lisp_function("show_yes_no",4,4, 7);
add_lisp_function("get_cwd",0,0, 8);
add_lisp_function("getenv",1,1, 9);
add_lisp_function("modify_install_path",1,1, 10);
add_c_bool_fun("dir_exsist",1,1, 0);
add_c_bool_fun("chdir",1,1, 1);
add_c_function("K_avail",1,1, 2); // path
add_c_bool_fun("nice_copy",3,3, 3); // source file, dest file
add_c_bool_fun("file_exsist",1,1, 4);
char esc_str[2]={27,0};
set_symbol_value(make_find_symbol("ESC_string"),new_lisp_string(esc_str));
}
void *l_caller(long number, void *arg)
{
p_ref r1(arg);
void *ret=NULL;
switch (number)
{
case 0 :
{ system(lstring_value(eval(CAR(arg)))); } break;
case 1 :
{
void *fn=eval(CAR(arg)); arg=CDR(arg);
p_ref r1(fn);
char *current_dir=lstring_value(eval(CAR(arg)));
char *filename=lstring_value(fn);
char *last=NULL,*s=filename,*dp;
char dir[200],name[200];
while (*s) { if (*s=='\\' || *s=='/') last=s+1; s++; }
if (last)
{
for (dp=dir,s=filename;s!=last;dp++,s++) { *dp=*s; }
*dp=0;
strcpy(name,last);
} else
{
strcpy(dir,current_dir);
strcpy(name,filename);
}
void *cs=(void *)new_cons_cell();
p_ref r24(cs);
((cons_cell *)cs)->car=new_lisp_string(dir);
((cons_cell *)cs)->cdr=new_lisp_string(name);
ret=cs;
} break;
case 2 :
{
void *fn=eval(CAR(arg)); arg=CDR(arg);
p_ref r1(fn);
char *slash=lstring_value(eval(CAR(arg)));
char *filename=lstring_value(fn);
char tmp[200],*s=filename,*tp;
for (tp=tmp;*s;s++,tp++)
{
if (*s=='/' || *s=='\\')
{
*tp=*slash;
// if (*slash=='\\')
// { tp++; *tp='\\'; }
}
else *tp=*s;
}
*tp=0;
ret=new_lisp_string(tmp);
} break;
case 3 :
{
char cd[100];
getcwd(cd,100);
char name_so_far[100];
char *dir=lstring_value(eval(CAR(arg)));
char *d,ch;
d=dir;
int err=0;
while (*d && !err)
{
if ((*d=='\\' || *d=='/') && d!=dir && *(d-1)!=':')
{
ch=*d;
*d=0;
if (!change_dir(dir))
if (make_dir(dir)!=0)
err=1;
*d=ch;
}
d++;
}
change_dir(cd);
if (err)
ret=NULL;
else ret=true_symbol;
} break;
case 4 :
{
char *fn=lstring_value(eval(CAR(arg)));
char *l=NULL,*s=fn;
while (*s) { if (*s=='.') l=s; s++; }
if (l) ret=new_lisp_string(l);
else ret=new_lisp_string("");
} break;
case 5 :
{
void *tit=eval(CAR(arg)); arg=CDR(arg);
p_ref r1(tit);
void *prompt=eval(CAR(arg)); arg=CDR(arg);
p_ref r2(prompt);
void *def=eval(CAR(arg)); arg=CDR(arg);
p_ref r3(def);
return nice_input(lstring_value(tit),lstring_value(prompt),lstring_value(def));
} break;
case 6 :
{
return nice_menu(CAR(arg),CAR(CDR(arg)),CAR(CDR(CDR(arg))));
} break;
case 7 :
{
return show_yes_no(CAR(arg),CAR(CDR(arg)),CAR(CDR(CDR(arg))),CAR(CDR(CDR(CDR(arg)))));
} break;
case 8 :
{
char cd[150];
getcwd(cd,100);
return new_lisp_string(cd);
} break;
case 9 :
{
return new_lisp_string(getenv(lstring_value(eval(CAR(arg)))));
} break;
case 10 :
{
char str[200];
strcpy(str,lstring_value(eval(CAR(arg))));
modify_install_path(str);
return new_lisp_string(str);
} break;
}
return ret;
}
// exten lisp function switches on number
main(int argc, char **argv)
{
lisp_init(100000,0x2000);
char *use_file="install.lsp";
for (int i=1;i<argc;i++)
{
if (!strcmp(argv[i],"-f"))
{
i++;
use_file=argv[i];
}
}
char prog[100],*s;
sprintf(prog,"(compile-file \"%s\")\n",use_file);
s=prog;
if (!eval(compile(s)))
{
printf("unable to open file %s",use_file);
exit(0);
}
return 0;
}